﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

public class ConexionSQL
{
    string CadenaDeConexion;
    public bool Conectado;

    SqlConnection Conector;
    SqlDataAdapter adaptador;
    SqlCommandBuilder actualizardb;
    DataTable tabla;

    int NumCon;

    ~ConexionSQL()
    {
        try
        {
            Conectado = false;
            Conector.Close();
            Conector.Dispose();

            Conector = null;
            adaptador = null;
            actualizardb = null;
            tabla = null;
        }
        catch { }
    }
    public ConexionSQL(int numConexion = 0)
    {
        Conectado = false;
        NumCon = 0;
        CadenaDeConexion = "";
        Conectar(numConexion);
    }
    public bool EstadoConexion()
    {
        return Conectado;
    }
    public ConexionSQL(bool ConectarAlDeclarar, int numConexion = 0)
    {
        Conectado = false;
        CadenaDeConexion = "";
        NumCon = 0;
        if (ConectarAlDeclarar)
        {
            Conectar(numConexion);
        }
    }
    public ConexionSQL(string CadenaConexion)
    {
        CadenaDeConexion = "";
        Conectar(CadenaConexion);
    }
    public void Conectar(int numConexion = 0)
    {
        if (string.IsNullOrEmpty(CadenaDeConexion) || NumCon != numConexion)
        {
            /*if (NumCon == 0)*/
            NumCon = numConexion;
            SqlConnectionStringBuilder sqlBuilder = Global.ConexionesBD[NumCon];
            CadenaDeConexion = sqlBuilder.ConnectionString;
        }

        try
        {
            Conector = new SqlConnection(CadenaDeConexion);
            Conector.Open();
            Conectado = true;
        }
        catch
        {
            Conectado = false;
        }
    }
    public void Conectar(string CadenaConexion)
    {
        if (/*!Conectado && */CadenaConexion != "")
        {
            CadenaDeConexion = CadenaConexion;
            try
            {
                Conector = new SqlConnection(CadenaDeConexion);
                Conector.Open();
                Conectado = true;
            }
            catch
            {
                Conectado = false;
            }
        }
    }
    public void SeleccionarBD(string bd)
    {
        if (Conectado)
        {
            try
            {
                Conector.ChangeDatabase(bd);
            }
            catch
            {

            }
        }
    }
    public bool Conectar(string Ruta, string Nom, string Pass)
    {
        CadenaDeConexion = "Data Source=" + Ruta;
        CadenaDeConexion += " ;Initial Catalog=master; Integrated Security=SSPI;";
        CadenaDeConexion += " User ID= " + Nom + "; Password=" + Pass + "; Connect Timeout=20";

        Conector = new SqlConnection(CadenaDeConexion);
        try
        {
            Conector.Open();
            Conectado = true;
        }
        catch
        {
            Conectado = false;
        }
        return Conectado;
    }
    public bool Conectar(string Ruta, string BD, string Nom, string Pass)
    {
        CadenaDeConexion = "Data Source=" + Ruta;
        CadenaDeConexion += " ;Initial Catalog=" + BD + ";";// Integrated Security=SSPI;";
        CadenaDeConexion += " User ID= " + Nom + "; Password=" + Pass + "; Connect Timeout=20";

        Conector = new SqlConnection(CadenaDeConexion);
        try
        {
            Conector.Open();

            Conectado = true;
        }
        catch
        {
            Conectado = false;
        }
        return Conectado;
    }
    public void Desconectar()
    {
        if (Conectado)
        {
            Conector.Close();
            Conector.Dispose();
            Conectado = false;
        }
        else
        {
            try
            {
                Conector.Close();
                Conector.Dispose();
                Conectado = false;
            }
            catch { }

        }

        Conector = null;
        adaptador = null;
        actualizardb = null;
        tabla = null;
    }
    public DataTable ConsultarTabla(string Consulta)
    {
        tabla = new DataTable();
        if (!Conectado || Conector.State == ConnectionState.Closed)
            Conectar();
        if (Conectado)
        {
            adaptador = new SqlDataAdapter(Consulta, Conector);
            actualizardb = new SqlCommandBuilder(adaptador);
            //try
            {
                adaptador.Fill(tabla);
                /*Conector.Close();
                Conectado = false;*/
            }
            /*catch (SqlException)
            {
                ;
            }*/
            return tabla;
        }
        else
        {
            return tabla;
        }
    }
    public DataTable ConsultarTablaEsquema(string Consulta)
    {
        tabla = new DataTable();
        if (!Conectado || Conector.State == ConnectionState.Closed)
            Conectar();
        if (Conectado)
        {
            adaptador = new SqlDataAdapter(Consulta, Conector);
            actualizardb = new SqlCommandBuilder(adaptador);

            adaptador.FillSchema(tabla, SchemaType.Mapped);

            return tabla;
        }
        else
        {
            return tabla;
        }
    }
    public void ActualizarTabla(DataTable DT)
    {
        if (!Conectado)
            Conectar();
        //try
        {
            adaptador.Update(DT);
        }
        /*catch (SqlException ex)
        {
            //MessageBox.Show(ex.Message, ex.Number.ToString());
         * 
         * //generar un registro de errores,, guardar en bd especial
                
        }
        catch (Exception ex)
        {
            //MessageBox.Show(ex.Message, ex.Source);
        }*/
    }

    public int EjecutarConsulta(string Query)
    {
        if (!Conectado)
            Conectar();

        SqlCommand command = new SqlCommand(Query, Conector);
        //command.Connection.Open();

        return command.ExecuteNonQuery();
    }

    public string EjecutarConsultaEscalar(SqlCommand command)
    {
        object Resultado;

        if (!Conectado)
            Conectar();

        command.Connection = Conector;
        try
        {
            command.Connection.Open();
        }
        catch { }
        Resultado = command.ExecuteScalar();
        if (Resultado == null)
        {
            return "";
        }
        else
        {
            return Resultado.ToString();
        }
    }
}